package com.jueling.culture.util;/**
 * @author linp
 * @date 2020/11/13
 */

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 *@author linp
 *@date 2020/11/13 
 */
public class MD5Util {

    /**
     * MD5加密
     * @param plainText
     * @return
     * @throws Exception
     */
    public static String md5Encryption(String plainText) throws Exception {
        String re_md5 = new String();
        try {
            byte[] b = md5(plainText.getBytes("ISO-8859-1"));
            re_md5 = byte2hex(b);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return re_md5;
    }

    /**
     * MD5
     */
    public static byte[] md5(byte[] input) throws Exception {
        MessageDigest alg = MessageDigest.getInstance("MD5");
        alg.update(input);
        return alg.digest();
    }

    /**
     * Convert byte[] to String
     */
    public static String byte2hex(byte[] b) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = Integer.toHexString(b[n] & 0XFF);
            if (stmp.length() == 1) {
                hs = hs + "0" + stmp;
            } else {
                hs = hs + stmp;
            }
        }
        return hs.toUpperCase();
    }

    /**
     * MD5
     * @param source
     * @return
     */
    public static String getMd5ByByte(byte[] source) {
        String s = null;
        char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(source);
            /**
             * MD5 的计算结果是一个 128 位的长整数
             */
            byte tmp[] = md.digest();
            // 用字节表示就是 16 个字节
            // 每个字节用 16 进制表示的话，使用两个字符，
            char str[] = new char[16 * 2];
            // 所以表示成 16 进制需要 32 个字符
            // 表示转换结果中对应的字符位置
            int k = 0;
            // 从第一个字节开始，对 MD5 的每一个字节
            for (int i = 0; i < 16; i++) {
                // 转换成 16 进制字符的转换
                // 取第 i 个字节
                byte byte0 = tmp[i];
                // 取字节中高 4 位的数字转换,>>>为逻辑右移，将符号位一起右移
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                // 取字节中低 4 位的数字转换
                str[k++] = hexDigits[byte0 & 0xf];
            }
            // 换后的结果转换为字符串
            s = new String(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return s;
    }

    public static String getMD5Str(String str) {
        byte[] digest = null;
        try {
            MessageDigest md5 = MessageDigest.getInstance("md5");
            digest  = md5.digest(str.getBytes("utf-8"));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //16是表示转换为16进制数
        String md5Str = new BigInteger(1, digest).toString(16);
        return md5Str.toUpperCase();
    }

    /**
     * MD5加密
     * @param plainText
     * @return
     * @throws Exception
     */
    public static String wechatMd5Encryption(String plainText) throws Exception {
        String re_md5 = new String();
        try {
            byte[] b = md5(plainText.getBytes("UTF-8"));
            re_md5 = byte2hex(b);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return re_md5;
    }



    public static void main(String[] args) throws Exception {
        String content = "appid=wx99723de842e8276c&body=【领航守护】用户：onNRJ41hB4B0yl4NIdcu_NFwGGQ0 支付 1 购买了套餐：月卡&mch_id=1449108302&nonce_str=26783618744293617118342026049178&notify_url=http://113.18.255.80:8010/lhsh_dev/wechat/notify&openid=onNRJ41hB4B0yl4NIdcu_NFwGGQ0&out_trade_no=LHSH20210106143855553130291592&spbill_create_ip=127.0.0.1&total_fee=1&trade_type=JSAPI&key=fujianguangtonghuliantongxin0000";
        System.out.println(getMd5ByByte(content.getBytes("UTF-8")));
        System.out.println(md5Encryption(content));
        System.out.println(wechatMd5Encryption(content));
    }



}
